package com.cjx.minio.api;

import com.cjx.minio.dto.FileManagementDTO;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.util.List;

/**
 *@Author cjunxian
 *@date 2020/09/24  09:52:48
 *@doc 文件管理服务api接口
 *@version 1.0.0
 */
public interface FileManagementService {

    /**
     * 获取文件信息
     *
     * @param fileId  文件管理id
     * @return 文件管理对象 file management by id
     */
    FileManagementDTO getFileManagementById(String fileId);

    /**
     * 获取多个文件
     * @param fileIds 文件管理id
     * @return 文件管理对象列表 file management by ids
     */
    List<FileManagementDTO> getFileManagementByIds(List<String> fileIds);

    /**
     * 删除文件
     * @param fileId 文件管理id
     * @return the boolean
     */
    boolean deleteFileManagementById(String fileId);

    /**
     * 删除多个文件
     * @param fileIds 文件管理id
     * @return
     */
    boolean deleteFileManagementByIds(List<String> fileIds);

    /**
     * 上传文件
     * @param file       文件对象
     * @param userId     用户id
     * @param canPreview 是否可预览
     * @return 文件管理对象 file management dto
     */
    FileManagementDTO saveFile(MultipartFile file, String userId, Long canPreview);

    /**
     * 上传多个文件
     * @param files      文件对象数组
     * @param userId     用户id
     * @param canPreview 是否可预览用
     * @return the list
     */
    List<FileManagementDTO> saveFiles(MultipartFile[] files, String userId, Long canPreview);

    /**
     * 下载文件到输出流
     * @param response   响应流
     * @param fileId     文件记录id
     * @return the boolean
     */
    boolean downloadFile2Stream(String fileId , HttpServletResponse response);



    /**
     * 下载多个文件为zip
     * @param response   响应流
     * @param fileIds      文件记录列表
     * @return the boolean
     */
    boolean downloadFiles2Zip(List<String> fileIds ,HttpServletResponse response);

    /**
     * 视频流处理
     * @param file       文件对象
     * @param userId     用户id
     * @param canPreview 是否可预览
     * @return 文件管理对象 file management dto
     */
    FileManagementDTO saveVideoFile(MultipartFile file, String userId, Long canPreview);

    /**
     * 异步视频流处理 jave 方式
     * @param fileName    文件名
     * @param inputStream 流
     * @param userId     用户id
     * @param canPreview 是否可预览
     * @param fileDTOs 保存上传结果
     */
    void saveMediaFile(String fileName, InputStream inputStream,String userId, Long canPreview,List<FileManagementDTO> fileDTOs);


    /**
     * 在线读取zip文件
     * @param file zip
     * @param userId 用户id
     * @return fileManageDTO列表
     */
    List<FileManagementDTO> readZipFile(MultipartFile file,String userId);


    /**
     * 上传文件
     * @param originalFilename 文件名
     * @param size 文件大小
     * @param contentType 文件类型
     * @param inputStream 输入流
     * @param userId 用户id
     * @param canPreview 是否预览
     * @return 文件管理对象 file management dto
     */
    FileManagementDTO saveFile(String originalFilename,Long size,String contentType,InputStream inputStream,String userId, Long canPreview);
}